<?php

namespace app\index\controller;

use think\Controller;

class Zip extends Controller
{
	//解压上传的压缩包到指定位置
	public function index()
	{
		$file="uploads/zip/layuiadmin.zip";	//上传的压缩包
		$url="uploads/zip";					//解压的路径
		$res=$this->down_ToZip($file,$url);
		echo $res["msg"];
	}
	//吧指定位置的文件打包成压缩包
	public function index2()
	{
		$file="uploads/zip2/".date("YmdHis",time()).".zip";	//要打包的压缩包存放位置和名称
		$url="../application/index";					//需要打包解压的路径  /根目录在public
		$res=$this->add_ToZip($file,$url);
		echo $res["msg"];
		echo "<br><a href='/".$file."'>点击下载</a>";
	}
	//解压压缩包
	public function down_ToZip($zipName,$url){
		
		//$zipName检测要解压压缩包是否存在
		if(!is_file($zipName)){
			return ["code"=>1,"msg"=>"压缩包不存在"];
		}
		//检测目标路径是否存在
		if(!is_dir($url)){
			@mkdir($url,0777,true);
		}
		$zip = new \ZipArchive;
		$res = $zip->open($zipName,\ZipArchive::CREATE);
		if ($res === TRUE) {
			$zip->extractTo($url);
			$zip->close();
			return ["code"=>0,"msg"=>"解压成功"];
			
		}else{
			return ["code"=>1,"msg"=>"解压失败"];
		}
	}
	
	public function add_ToZip($zipName,$url){
		//检测目标路径是否存在
		if(!is_dir($url)){
			return ["code"=>1,"msg"=>"解压的路径不存在"];
		}
		$zip = new \ZipArchive;
		$res = $zip->open($zipName,\ZipArchive::CREATE);
		if ($res === TRUE) {
			
			$this->addFileToZip($url, $zip); // 调用方法，对要打包的根目录进行操作，并将ZipArchive的对象传递给方法
			$zip->close();
			return ["code"=>0,"msg"=>"成功"];
		}else{
			return ["code"=>1,"msg"=>"失败"];
		}
	}
	
	 
 
	function addFileToZip($path, $zip)
		{
		    $handler = opendir($path); // 打开指定指定文件夹
		    while (($filename = readdir($handler)) !== false) {
		        if ($filename != "." && $filename != "..") { // 文件夹文件名字为'.'和‘..’，不要对他们进行操作
		            if (is_dir($path . "/" . $filename)) { // 如果读取的某个对象是文件夹，则递归往下
		                $this->addFileToZip($path . "/" . $filename, $zip);
		            } else {
		                $zip->addFile($path . "/" . $filename);
		            }
		        }
		    }
		    @closedir($path); // 关闭目录指定指定文件夹
	    }
 
}
